<?php
/**
 *	美冠游戏桌PHP-SDK, API部分
 *	2016-08-18 13:33:05
 * 1. 返回数据分4部分
 * 1） status: 表成功和失败状态。1表示成功，为0表示失败
 * 2） result_desc: 错误信息，当有错误发生时，此字段包含有错误信
 * 3） result_code: 错误编码，当有错误发生时，此字段包含有错误编码
 * 4） data：返回数据报文体
 *
 */
namespace Org\Util;

use Think\Log;

class MgInterface
{
	const API_URL_PREFIX2 = 'http://uat.microwncloud.com';
	const API_URL_PREFIX = 'http://mg.baobaot.com/ips.api';
	const OSS_URL = 'http://bbt-yyy.oss-cn-beijing.aliyuncs.com/';
	const GET_TERMINALS_BY_TMLSNS_URL = '/rest/terminalAPI/getTerminalsByTmlSNs';//机器详细信息查询接口
	const GET_TERMINALS_ONLINE_BY_IDS_URL = '/rest/terminalAPI/getTerminalsOnlineByIds';//机器在线/离线状态查询接口
	const STARTUP_URL = '/rest/terminalAPI/startup';//机器开机控制接口
	const SHUTDOWN_URL = '/rest/terminalAPI/shutdown';//机器关机控制接口
	const WORK_CONTROL_URL = '/rest/terminalAPI/workControl';//机器工作时间设置接口
	const SOUND_CONTROL_URL = '/rest/terminalAPI/soundControl';//机器声音设置接口
	const BRIGHT_CONTROL_URL = '/rest/terminalAPI/brightControl';//机器亮度设置接口
	const GET_TERMINAL_STATE_BY_IDS_URL = '/rest/terminalAPI/getTerminalStateByIds';//机器状态信息查询接口
	const ADD_SOURCE_URL = '/rest/sourceAPI/addSource ';//素材上传接口
	const GET_PROGRAM_TEMPLATE_LIST_URL = '/rest/templateApi/getProgramTemplateList';//节目单模板查询接口
	const GET_PROGRAM_TEMPLATE_BY_ID_URL = '/rest/templateApi/getProgramTemplateById';//节目单模板详细信息查询接口
	const GET_EDITABLE_AREAS_BYT_EMPLATE_ID_URL = '/rest/templateApi/getEditableAreasByTemplateId';//可编辑播放区信息接口
	const ADD_PLAN_FOR_PROGRAM_TEMPLATE_URL = '/rest/templateApi/addPlanForProgramTemplate';//节目单下发接口

	private $token;
	private $appid;
	private $appsecret;
	public $debug =  false;
	public $logcallback;

	public function __construct($options){
		$this->token = isset($options['token'])?$options['token']:'';
		$this->appid = isset($options['appid'])?$options['appid']:'';
		$this->appsecret = isset($options['appsecret'])?$options['appsecret']:'';
		$this->debug = isset($options['debug'])?$options['debug']:false;
		$this->logcallback = isset($options['logcallback'])?$options['logcallback']:false;
	}

    public static $errCode = array(
        '0' => '处理成功',
        '1' => '提交成功',
        '10001' => '参数信息为空',
        '10002' => '伙伴ID有误',
        '10003' => '终端SN有误',
        '10004' => '终端ID为空，或错误的ID',
        '10005' => '工作时间参数有误',
        '10006' => '音量参数有误',
        '10007' => '亮度参数有误',
        '10008' => '素材路径参数为空',
        '10009' => '素材文件不存在',
        '10010' => '设备不存在',
        '10011' => '时间设置有误',
        '10012' => '模板ID为空',
        '10013' => '播放器数据查询出错',
        '10014' => '播放器数据查询出错',
        '10015' => '节目单下发出错',
        '10016' => '当前上传的apk文件包名与原有不一致',
        '10017' => '上传游戏版本必须大于原有版本',
        '10018' => '当前上传的apk文件在服务端已存在',
        '10019' => '上传游戏签名与原有签名不一致'

    );

	public static $httpCode = array(
		'100' => 'Continue',
		'101' => 'Switching Protocols',
		'200' => 'OK',
		'201' => 'Created',
		'202' => 'Accepted',
		'203' => 'Non-Authoritative Information',
		'204' => 'No Content',
		'205' => 'Reset Content',
		'206' => 'Partial Content',
		'300' => 'Multiple Choices',
		'301' => 'Moved Permanently',
		'302' => 'Found',
		'303' => 'See Other',
		'304' => 'Not Modified',
		'305' => 'Use Proxy',
		'306' => '(Unused)',
		'307' => 'Temporary Redirect',
		'400' => 'Bad Request',
		'401' => 'Unauthorized',
		'402' => 'Payment Required',
		'403' => 'Forbidden',
		'404' => 'Not Found',
		'405' => 'Method Not Allowed',
		'406' => 'Not Acceptable',
		'407' => 'Proxy Authentication Required',
		'408' => 'Request Timeout',
		'409' => 'Conflict',
		'410' => 'Gone',
		'411' => 'Length Required',
		'412' => 'Precondition Failed',
		'413' => 'Request Entity Too Large',
		'414' => 'Request-URI Too Long',
		'415' => 'Unsupported Media Type',
		'416' => 'Requested Range Not Satisfiable',
		'417' => 'Expectation Failed',
		'500' => 'Internal Server Error',
		'501' => 'Not Implemented',
		'502' => 'Bad Gateway',
		'503' => 'Service Unavailable',
		'504' => 'Gateway Timeout',
		'505' => 'HTTP Version Not Supported'
	);

    public static function getErrText($err) {
        if (isset(self::$errCode[$err])) {
            return self::$errCode[$err];
        }else {
        	if($err){
				return "Unknown Err Code :$err";
        	}else{
				return "Unknown Err : NULL";
        	}
        };
    }

	public static function getHttpCode($http){
        if (isset(self::$httpCode[$http])) {
            return self::$httpCode[$http];
        }else {
        	if($http){
				return "Unknown Http Code :$http";
        	}else{
				return "Unknown Http : NULL";
        	}
        };
	}

    /**
     * 日志记录，可被重载。
     * @param mixed $log 输入日志
     * @return mixed
     */
    protected function log($log){
		if ($this->debug && function_exists($this->logcallback)) {
			if (is_array($log)) $log = print_r($log,true);
			return call_user_func($this->logcallback,$log);
		}
    }

	/**
	 * GET 请求
	 * @param string $url
	 */
	private function http_get($url){
		$oCurl = curl_init();
		if(stripos($url,"https://")!==FALSE){
			curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
			curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
			curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
		}
		curl_setopt($oCurl, CURLOPT_URL, $url);
		curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
		$sContent = curl_exec($oCurl);
		$aStatus = curl_getinfo($oCurl);
		curl_close($oCurl);
		if(intval($aStatus["http_code"])==200){
			return $sContent;
		}else{
			return $this->getHttpCode(intval($aStatus["http_code"]));
		}
	}

	/**
	 * POST 请求
	 * @param string $url
	 * @param array $param
	 * @param boolean $post_file 是否文件上传
	 * @return string content
	 */
	private function http_post($url,$param,$post_file=false){
		$ch = curl_init();
		if(stripos($url,"https://")!==FALSE){
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
			curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
			curl_setopt($ch, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
		}

		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
				'Content-Type: application/json; charset=utf-8',
				'Content-Length: ' . strlen($param)
			)
		);
		$response = curl_exec($ch);
		$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
		curl_close($ch);
		if($httpCode==200){
			return $response;
		}else{
			return $this->getHttpCode($httpCode);
		}
	}

	/**
	 * 获取token
	 * @param string $appid 如在类初始化时已提供，则可为空
	 * @param string $appsecret 如在类初始化时已提供，则可为空
	 */
	public function checkAuth($appid='',$appsecret=''){
		if (!$appid && !$appsecret) {
			$appid = $this->appid;
			$appsecret = $this->appsecret;
		}
			$result = $this->http_get(self::API_URL_PREFIX.'&appid='.$appid.'&secret='.$appsecret);
        if ($result){
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return $this->token = $json;

		}
		return false;
	}

    /**
     * getTerminalsByTmlSNs 	机器详细信息查询接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlSNs 			String[] 		必须				一组需要查询的SN数组，样例: ["TA43031","TA43032","TA43033"]
	 * partner_no 		String 			必须 				合作伙伴ID
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		[
		    {
		        "id": "33219198",
		        "name": "ABC",
		        "online": false,
		        "tmlDisk": "5130",
		        "tmlIpAddress": "10. 56.173.46",
		        "tmlMicAddress": "",
		        "version": "",
		        "tmlSN": "AD0000001",
		        "tmlTime": "2016-03-12 13:34:28"
		    },
		    {
		        "id": "33219199",
		        "name": "50 ੑ",
		        "online": false,
		        "tmlDisk": "5130",
		        "tmlIpAddress": "10.56.173.46",
		        "tmlMicAddress": "",
		        "version": "",
		        "tmlSN": "AD0000001",
		        "tmlTime": "2016-03-12 13:34:59"
		    }
		]

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			id 				终端的唯一标识，用于后续的终端控制 					33123212
	 * 终端名称			name 			终端接入时，自动设置的终端名称，默 认为终端的SN 		TA4303XXXXXXX
	 * 终端SN 			tmlSN 			出厂时生成的唯一机器码 							TA4303XXXXXXX
	 * 硬盘容量 			tmlDisk 		终端当前的硬盘总容量
	 * 接入时间 			tmlTime 		终端第一次接入系统的时间
	 * 终端状态			online 			终端在线/离线 状态 							在线
	 * 终端IP地址 			tmlIpAddress 	当前终端正在使用的IP地址
	 * 终端MAC地址 			tmlMicAddress 	当前终端使用的网卡的MAC地址
	 * 终端软件 版本 			version 		当前终端上运行的软件版本
	 * 亮度 				tmlBrightness 	当前设备的亮度信息
	 * 音量 				tmlVolumeJson 	当前设备的音量
	 * 工作时间 			tmlWorktimeJson 当前设备的工作时间
	 *
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 15:53:33
     */
    public function getTerminalsByTmlSNs($tmlSNs){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlSNs' => $tmlSNs,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_TERMINALS_BY_TMLSNS_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return $json['data'];
        }
        return false;
    }

	/**
     * getTerminalsOnlineByIds 	机器在线/离线状态查询接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33212312","33212312","33212312"]
	 * partner_no 		String 			必须 				合作伙伴ID
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		[
		    {
		        "id": "33219204",
		        "name": "第一块",
		        "online": false,
		        "tmlSN": "34166cfb1e08e788"
		    },
		    {
		        "id": "33219203",
		        "name": "50ੑ吋",
		        "online": false,
		        "tmlSN": "6394fe47ff698ddc"
		    }
		]

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			id 				终端的唯一标识，用于后续的终端控制 					33123212
	 * 终端名称			name 			终端接入时，自动设置的终端名称，默 认为终端的SN 		TA4303XXXXXXX
	 * 终端SN 			tmlSN 			出厂时生成的唯一机器码 							TA4303XXXXXXX
	 * 在线状态 			online 			true - 在线；false - 离线					true/false
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 16:20:33
     */
    public function getTerminalsOnlineByIds($tmlId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_TERMINALS_ONLINE_BY_IDS_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return $json['data'];
        }
        return false;
    }

	/**
     * startup  	机器开机控制接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123212","33123212"]
	 * partner_no 		String 			必须 				合作伙伴ID
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [ ],
		    "result_code": 1,
		    "result_desc": "开机指令发送成功",
		    "status": 1
		}

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			tmlId			终端的唯一标识，用于后续的终端控制 					33123212
	 * 开机信息 			resMsg 			终端开机标识 								success / error

	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 16:40:19
     */
    public function startup($tmlId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::STARTUP_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }

	/**
     * shutdown   	机器关机控制接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123213","33123214"]
	 * partner_no 		String 			必须 				合作伙伴ID
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [ ],
		    "result_code": 1,
		    "result_desc": "关机指令发送成功",
		    "status": 1
		}

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			tmlId			终端的唯一标识，用于后续的终端控制 					33123212
	 * 关机信息 			resMsg 			终端关机标识 								success / error

	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 17:00:36
     */
    public function shutdown($tmlId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::SHUTDOWN_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }

	/**
     * workControl    	机器工作时间设置接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123213","33123214"]
	 * partner_no 		String 			必须 				合作伙伴ID
	 * tmlWorktimeJson 	JSON 			必须 				[{"bootTime":"02:44:06","shutdownTime":"22:44:06"}]
	 *
	 * 请求示例
	 * {"tmlIds":["33219195"],"partner_no":"201608", "tmlWorktimeJson":"[{\"bootTime\":\"02:44:06\",\"shutdownTime\":\"22:44:06\"},{\"bootTime\":\"04:44:06\",\"shutdownTime\":\"22:44:06\"}]"}
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [ ],
		    "result_code": 1,
		    "result_desc": "工作时间设置成功",
		    "status": 1
		}

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			tmlId			终端的唯一标识，用于后续的终端控制 					33123212
	 * 工作时间设置信息 		resMsg 			标识 										success / error

	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 17:20:43
     */
    public function workControl($tmlId,$tmlWorktimeJson){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'tmlWorktimeJson' => json_encode($tmlWorktimeJson),
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::WORK_CONTROL_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }

	/**
     * soundControl    	机器声音设置接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123213","33123214"]
	 * partner_no 		String 			必须 				合作伙伴ID
	 * tmlVolumeJson 	JSON 			必须 				[{"startTime":"12:40:02","endTime":"13:40:02","volume":35}]
	 *
	 * 请求示例
	 * {"tmlIds":["33219203"],"partner_no":"201608", "tmlVolumeJson":" [{\"startTime\":\"12:40:02\",\"endTime\":\"13:40:02\",\"volume\":35}] "}
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [ ],
		    "result_code": 1,
		    "result_desc": "终端音量设置成功",
		    "status": 1
		}

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			tmlId			终端的唯一标识，用于后续的终端控制 					33123212
	 * 音量设置标识 			resMsg 			标识 										success / error

	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 17:40:51
     */
    public function soundControl($tmlId,$tmlVolumeJson){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'tmlVolumeJson' =>json_encode($tmlVolumeJson),
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::SOUND_CONTROL_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }

	/**
     * brightControl    	机器亮度设置接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123213","33123214"]
	 * partner_no 		String 			必须 				合作伙伴ID
	 * bright 			Integer 		必须
	 *
	 * 请求示例
	 * {"tmlIds":["33219203"],"partner_no":"201608","bright":50}
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [ ],
		    "result_code": 1,
		    "result_desc": "终端亮度设置成功",
		    "status": 1
		}

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			tmlId 			终端的唯一标识，用于后续的终端控制 					33123212
	 * 亮度信息标识 			resMsg 			标识		 								success / error

	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 18:00:18
     */
    public function brightControl($tmlId,$bright){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'bright' => $bright,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::BRIGHT_CONTROL_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }

	/**
     * getTerminalStateByIds    	机器状态信息查询接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123213","33123214"]
	 * partner_no 		String 			必须 				合作伙伴ID
	 *
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		[
		    {
		        "id": "33219198",
		        "name": "ABC",
		        "online": false,
		        "tmlDisk": "5130",
		        "tmlIpAddress": "10. 56.173.46",
		        "tmlMicAddress": "",
		        "version": "",
		        "tmlSN": "AD0000001",
		        "tmlTime": "2016-03-12 13:34:28"
		    },
		    {
		        "id": "33219199",
		        "name": "50 ੑ",
		        "online": false,
		        "tmlDisk": "5130",
		        "tmlIpAddress": "10.56.173.46",
		        "tmlMicAddress": "",
		        "version": "",
		        "tmlSN": "AD0000001",
		        "tmlTime": "2016-03-12 13:34:59"
		    }
		]

	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 终端ID 			id 				终端的唯一标识，用于后续的终端控制 					33123212
	 * 终端名称			name 			终端接入时，自动设置的终端名称，默 认为终端的SN 		TA4303XXXXXXX
	 * 终端SN 			tmlSN 			出厂时生成的唯一机器码 							TA4303XXXXXXX
	 * 硬盘容量 			tmlDisk 		终端当前的硬盘总容量
	 * 接入时间 			tmlTime 		终端第一次接入系统的时间
	 * 终端状态			online 			终端在线/离线 状态 							在线
	 * 终端IP地址 			tmlIpAddress 	当前终端正在使用的IP地址
	 * 终端MAC地址 			tmlMicAddress 	当前终端使用的网卡的MAC地址
	 * 终端软件 版本 			version 		当前终端上运行的软件版本
	 *
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-18 18:20:10
     */
    public function getTerminalStateByIds($tmlId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'tmlIds' => $tmlId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_TERMINAL_STATE_BY_IDS_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json['data'];
        }
        return false;
    }

	/**
     * addSource     	素材上传接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * ossFilePath 		String 			必须 				文件在 OSS 路径信息
	 * iconFilePath 	String 			可选				图标文件在 OSS 路径信息（上传APK 时，可根据需要设 置）
	 * partner_no 		String 			必须 				合作伙伴ID
	 *
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
		{
		    "data": [
		        {
		            "dirName": "20160830180527452.png",
		            "id": "100455",
		            "inAnimation": 0,
		            "interval": 0,
		            "name": "20160718152023906.png",
		            "outAnimation": 0,
		            "playTimes": 0,
		            "remote": "data/ftp/static/upload/image/2016/08/30/20160830180527452.png",
		            "serverPath": "http://microwntest.oss-cnbeijing.aliyuncs.com/data/ftp/static/upload/image/2016/08/30/s_20160830180527452.png",
		            "size": "422388",
		            "sort": 0,
		            "type": "img",
		            "validDay": 0,
		            "weight": 0
		        }
		    ],
		    "result_code": 1,
		    "result_desc": "接口调用成功",
		    "status": 1
		}
	 *
	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * resMsg 			resMsg 			返回信息 									success 、 error
	 *
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-08-25 17:20:10
     */
    public function addSource($ossFilePath,$iconFilePath=''){
        if (!$this->token && !$this->checkAuth()) return false;
		if($iconFilePath){ $iconFilePath = self::OSS_URL.$iconFilePath;}else{$iconFilePath = 'null';}
        $data = array(
            'ossFilePath' => self::OSS_URL.$ossFilePath,
            'iconFilePath' => $iconFilePath,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::ADD_SOURCE_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json['data'];
        }
        return false;
    }

	/**
     * getProgramTemplateList      	节目单模板查询接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * partner_no 		String 			必须 				合作伙伴ID
	 *
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
	[
	    {
	        "id": 33212312,
	        "name": "TA430322332",
	        "width": "",
	        "height": "",
	        "groupId": ""
	    }
	 ......
	]
	 *
	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 模板ID 			Id
	 * 模板名称 			name
	 * 模板宽				width
	 * 模板高 				height
	 * 模板分组 			groupId
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-09-01 11:55:24
     */
    public function getProgramTemplateList (){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_PROGRAM_TEMPLATE_LIST_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json['data'];
        }
        return false;
    }

	/**
     * getProgramTemplateById       	节目单模板详细信息查询接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * partner_no 		String 			必须 				合作伙伴ID
	 * templateId 		String 			必须 				模板ID
	 *
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
	{
	    "data": [
	        {
	            "areas": [
	                {
	                    "areaIndex": 1,
	                    "height": 1080,
	                    "id": "MicProgramTemplate-ff80808156d44b9d0156d44b9d5c000195f23d36-d080-4e1f-ba44-6702ab1716d6",
	                    "left": 0,
	                    "lockState": 1,
	                    "name": "播放区",
	                    "sources": [
	                        {
	                            "dirName": "20160802190129921.jpg",
	                            "id": "100390",
	                            "inAnimation": 1,
	                            "interval": 5,
	                            "name": "3会员套餐.jpg",
	                            "outAnimation": 2,
	                            "playTimes": 0,
	                            "remote": "data/ftp/static/upload/image/2016/08/02/20160802190129921.jpg",
	                            "serverPath": "http://123.57.135.167:9180/upload/image/2016/08/02/s_20160802190129921.jpg",
	                            "size": "1147629",
	                            "sort": 1,
	                            "type": "img",
	                            "validDay": 0,
	                            "weight": 0
	                        },
	                        {
	                            "dirName": "20160802184503551.jpg",
	                            "id": "100389",
	                            "inAnimation": 1,
	                            "interval": 5,
	                            "name": "2双人套餐.jpg",
	                            "outAnimation": 2,
	                            "playTimes": 0,
	                            "remote": "data/ftp/static/upload/image/2016/08/02/20160802184503551.jpg",
	                            "serverPath": "http://123.57.135.167:9180/upload/image/2016/08/02/s_20160802184503551.jpg",
	                            "size": "1294389",
	                            "sort": 2,
	                            "type": "img",
	                            "validDay": 0,
	                            "weight": 0
	                        }
	                    ],
	                    "top": 0,
	                    "type": "animate",
	                    "width": 1920
	                }
	            ],
	            "controlHeight": 1080,
	            "controlWidth": 1920,
	            "height": 1080,
	            "id": "MicProgramTemplate-ff80808156d44b9d0156d44b9d5c0001",
	            "name": "测试模板",
	            "time": 0,
	            "width": 1920
	        }
	    ],
	    "result_code": 1,
	    "result_desc": "接口调用成功",
	    "status": 1
	}
	 *
	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 模板ID 			Id
	 * 模板名称 			name
	 * 模板宽				width
	 * 模板高 				height
	 * 模板分组 			groupId
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-09-01 14:45:21
     */
    public function getProgramTemplateById($templateId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
        	'templateId' => $templateId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_PROGRAM_TEMPLATE_BY_ID_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json['data'][0];
        }
        return false;
    }

	/**
     * getEditableAreasByTemplateId       	 可编辑播放区信息接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * partner_no 		String 			必须 				合作伙伴ID
	 * templateId 		String 			必须 				模板ID
	 *
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
	{
	    "data": [
	        {
	            "areaIndex": 1,
	            "height": 1080,
	            "left": 0,
	            "name": "܄播放区",
	            "sources": [
	                {
	                    "dirName": "20160822155137594.jpg",
	                    "id": "100441",
	                    "inAnimation": 0,
	                    "interval": 0,
	                    "name": "小图3.jpg",
	                    "outAnimation": 0,
	                    "playTimes": 0,
	                    "remote": "data/ftp/static/upload/image/2016/08/22/20160822155137594.jpg",
	                    "serverPath": "http://micrown-test.oss-cnbeijing.aliyuncs.com/data/ftp/static/upload/image/2016/08/22/s_20160822155137594.jpg",
	                    "size": "255514",
	                    "sort": 1,
	                    "type": "img",
	                    "validDay": 0,
	                    "weight": 0
	                }
	            ],
	            "top": 0,
	            "type": "img",
	            "width": 640
	        }
	    ],
	    "result_code": 1,
	    "result_desc": "接口调用成功",
	    "status": 1
	}
	 *
	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 模板ID 			Id
	 * 模板名称 			name
	 * 模板宽				width
	 * 模板高 				height
	 * 模板分组 			groupId
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-09-01 16:32:17
     */
    public function getEditableAreasByTemplateId($templateId){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
        	'templateId' => $templateId,
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::GET_EDITABLE_AREAS_BYT_EMPLATE_ID_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json['data'];
        }
        return false;
    }


	/**
     * addPlanForProgramTemplate       	节目单下发接口
	输入参数
	 * 名称 				类型				是否必 须			描述
	 * partner_no 		String 			必须 				合作伙伴ID
	 * templateId 		String 			必须 				模板ID
	 * tmlIds 			String[] 		必须				终端ID数组，样例: ["33123212","33123212","33123212"]
	 * playProgram 		String 			必须 				生成的节目单对象信息
	 *
	输入示例
	{
	    "areas": [
	        {
	            "areaIndex": 1,
	            "height": 1080,
	            "id": "MicProgramTemplateff80808156d4ef590156d4ef59a80001-f28be7f3-d4b6-4284-83641841aece967f",
	            "left": 0,
	            "lockState": 1,
	            "name": "播放区",
	            "sources": [
	                {
	                    "dirName": "20160822155137594.jpg",
	                    "id": "100441",
	                    "inAnimation": 0,
	                    "interval": 0,
	                    "name": "小图3.jpg",
	                    "outAnimation": 0,
	                    "playTimes": 0,
	                    "remote": "data/ftp/static/upload/image/2016/08/22/20160822155137594.jpg",
	                    "serverPath": "http://micrown-test.osscnbeijing.aliyuncs.com/data/ftp/static/upload/image/2016/08/22/s_20160822155137594.jpg",
	                    "size": "255514",
	                    "sort": 1,
	                    "type": "img",
	                    "validDay": 0,
	                    "weight": 0
	                }
	            ],
	            "top": 0,
	            "type": "img",
	            "width": 640
	        },
	        {
	            "areaIndex": 2,
	            "height": 1080,
	            "id": "MicProgramTemplateff80808156d4ef590156d4ef59a80001-950348bf-4d9a-4359-8309d1da2647b9b8",
	            "left": 640,
	            "lockState": 2,
	            "name": "播放区",
	            "sources": [
	                {
	                    "dirName": "20160802184503551.jpg",
	                    "id": "100389",
	                    "inAnimation": 0,
	                    "int erval": 0,
	                    "name": "2双人套餐.jpg",
	                    "outAnimation": 0,
	                    "playTimes": 0,
	                    "remote": "data/ftp/static/upload/image/2016/08/02/20160802184503551.jpg",
	                    "serverPath": "http://123.57.135.167:91 80/upload/image/2016/08/02/s_20160802184503551.jpg",
	                    "size": "1294389",
	                    "sort ": 1,
	                    "type": "img",
	                    "validDay": 0,
	                    "weight": 0
	                }
	            ],
	            "top": 0,
	            "type": "img",
	            "width": 640
	        },
	        {
	            "areaIndex": 3,
	            "height": 1080,
	            "id": "MicProgramTemplateff80808156d4ef590156d4ef59a80001-7a4ac31a-b0d7-444c-8514c2af6b1d14d5",
	            "left": 1280,
	            "lockState": 2,
	            "name": "播放区",
	            "sources": [
	                {
	                    "dirName": "20160802190129921.jpg",
	                    "id": "100390",
	                    "inAnimation": 0,
	                    "int erval": 0,
	                    "name": "3会员套餐.jpg",
	                    "outAnimation": 0,
	                    "playTimes": 0,
	                    "remote": "data/ftp/static/upload/image/2016/08/02/20160802190129921.jpg",
	                    "serverPath": "http://123.57.135.167:91 80/upload/image/2016/08/02/s_20160802190129921.jpg",
	                    "size": "1147629",
	                    "sort ": 1,
	                    "type": "img",
	                    "validDay": 0,
	                    "weight": 0
	                }
	            ],
	            "top": 0,
	            "type": "img",
	            "width": 640
	        }
	    ],
	    "controlHeight": 1080,
	    "controlWidth": 1920,
	    "height": 1080,
	    "id": "MicProgramTemplate-ff80808156d4ef590156d4ef59a80001",
	    "name": "001测试节目单",
	    "time": 0,
	    "width": 1920
	}
	返回结果
	 * 名称 				类型 				描述
	 * status 			Number			返回结果值，描述当前接口的调用状态
	 * result_desc 		String 			发生异常情况时返回详细错误信息
	 * result_code 		Number 			返回错误值
	 * data 			JSON 			返回数据的详细内容，详见下面描述
     * 正确返回JSON 数据示例:
	{									--节目单信息
	    "id": "",
	    "name": "",
	    "width": "",
	    "height": "",
	    "controlWidth": "",
	    "controlHeight": "",
	    "time": "",
	    "areas": [
	        {							--播放区信息
	            "name": "",
	            "lockState": "1/2",		（1--可播放区，2--不可播放区[锁定]）
	            "areaIndex": "1",
	            "height": "",
	            "id": "",
	            "top": "",
	            "type": "",
	            "width": "",
	            "sources": [
	                {					--素材信息
	                    "dirName": "20160822155137594.jpg",
	                    "id": "100441",
	                    "inAnimation": 0,
	                    "interval": 0,
	                    "name": "3.jpg",
	                    "outAnimation": 0,
	                    "playTimes": 0,
	                    "remote": "data/ftp/static/upload/image/2016/08/22/20160822155137594.jpg",
	                    "serverPath": "http://micrown-test.oss-cnbeijing.aliyuncs.com/data/ftp/static/upload/image/2016/08/22/s_20160822155137594. jpg",
	                    "size": "255514",
	                    "sort": 1,
	                    "type": "img",
	                    "validDay": 0,
	                    "weight": 0
	                },
	                { },
	                { }
	            ]
	        },
	        { },
	        { }
	    ]
	}
	 *
	 * 字段中文 名称			字段英文名称 		说明 										数据样例
	 * 模板ID 			Id
	 * 模板名称 			name
	 * 模板宽				width
	 * 模板高 				height
	 * 模板分组 			groupId
	 *
     * @access public
     * @author Powerless<wzxaini9@gmail.com>
     * @version 2016-09-01 16:32:17
     */
    public function addPlanForProgramTemplate($templateId,$tmlIds,$playProgram){
        if (!$this->token && !$this->checkAuth()) return false;
        $data = array(
        	'templateId' => $templateId,
        	'tmlIds' => $tmlIds,
        	'playProgram' => json_encode($playProgram),
            'partner_no' => $this->token
        );
        $result = $this->http_post(self::API_URL_PREFIX . self::ADD_PLAN_FOR_PROGRAM_TEMPLATE_URL, json_encode($data));
        $this->log($result);
        if ($result) {
            $json = json_decode($result, true);
            if (!$json || $json['result_code']!=1) {
                return $this->getErrText($json['result_code']);
            }
            return 	$json;
        }
        return false;
    }
}